home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / misc / amag / AM9402_2.lha / mmu-artikel / mmutest030.asm < prev    next >
Assembly Source File  |  1993-12-08  |  5KB  |  198 lines

  1. * Diese Programm legt im Speicher zwei 4 KByte
  2. * große Seiten an. Diese Seiten werden den
  3. * logischen Adressen $C0000000 und $C0001000 zuge-
  4. * wiesen. Die zweite Seite ist zusätzlich noch
  5. * schreibgeschüzt. Wird die logische Adresse
  6. * $C0002000 angesprochen, wird ein Bus-Fehler aus-
  7. * gelöst. Wenn sie das Programm starten und es
  8. * passiert nichts, wissen sie, daß alles geklappt
  9. * hat. Blinkt der Bildschirm ist irgend etwas
  10. * nicht in Ordnung.
  11.  
  12.   MC68030
  13.  
  14.   include 'exec/exec_lib.i'
  15.   include 'exec/memory.i'
  16.   include 'intuition/intuition_lib.i'
  17.  
  18.   move.l #PageMemLen+4096,d0  ; Diese Zeilen sind
  19.   move.l #MEMF_CLEAR,d1
  20.   CALLEXEC AllocVec
  21.   tst.l d0
  22.   bne MemOk
  23.   bsr Flash
  24.   bra NoMem
  25. MemOk:
  26.   move.l d0,-(sp)
  27.   add.l #4096,d0
  28.   lsr.l #8,d0  ; nur dafür gedacht
  29.   lsr.l #4,d0
  30.   lsl.l #8,d0
  31.   lsl.l #4,d0
  32.   move.l d0,a5
  33.   lea.l LevelA-Page0(a5),a0
  34.   move.l a0,RootPointerDesc+4
  35.   lea.l LevelB-Page0(a5),a0
  36.   move.l a0,LevelA+100  ; die Seiten auf eine
  37.   lea.l LevelC-Page0(a5),a0
  38.   move.l a0,LevelB+4
  39.   lea.l $01(a5),a0
  40.   move.l a0,LevelC
  41.   lea.l Page1-Page0+$05(a5),a0  ; gerade 4 KByte-
  42.   move.l a0,LevelC+4 ; Grenze
  43.   lea.l Page0,a0
  44.   move.l a5,a1
  45.   move.l #PageMemLen,d0
  46.   CALLEXEC CopyMem  ; zu bringen.
  47.  
  48.   CALLEXEC SuperState
  49.   movec vbr,a0
  50.   move.l 8(a0),a4  ; Vektor für Bus-Fehler retten
  51.   move.l #HandleExcept,8(a0)
  52.   ; eigen Routine eintragen
  53.   pmove tc,OldTCValue   ; normalerweise sollte man
  54.   ; prüfen, ob das Enable-Bit gesetzt ist. Und wenn
  55.   ; dies der Fall ist, sollte man die MMU nicht be-
  56.   ; nutzen. Aber es sollten auf jeden Fall alle Re-
  57.   ; gister am Ende wieder hergestellt werden.
  58.   pmove ClearTC,tc
  59.   pmove crp,OldRootPointerDesc
  60.   pflusha
  61.   pmove RootPointerDesc,crp
  62.   pmove TCValue,tc
  63.   CALLEXEC UserState
  64.  
  65.   move.l #'Test',$C0000000  ; $C0000000 = Page0
  66.   move.l $C0000000,d0
  67.   cmp.l (a5),d0  ; Adresse von Page0 in a5
  68.   beq Page0Ok
  69.   bsr Flash
  70. Page0Ok:
  71.   move.w #'WP',$C0001000  ; $C0001000 = Page1
  72.   cmp.w #$3210,$C0001000
  73.   ; unverändert, da Screibschutz
  74.   beq Page1Ok
  75.   bsr Flash
  76. Page1Ok:
  77.   move.l $C0002000,d0  ; hier tritt Bus-Fehler auf
  78.   bsr Flash
  79.  
  80. Ende:
  81.   CALLEXEC SuperState
  82.   movec vbr,a0
  83.   move.l a4,8(a0)  ; alten Vektor wieder herstellen
  84.   pmove ClearTC,tc
  85.   pflusha
  86. *  pmove OldRootPointerDesc,crp  ; Die alten Werte
  87. *  pmove OldTCValue,tc         ; dürfen nur wieder
  88.   ; hergestellt werden, wenn man vorher geprüft ob
  89.   ; diese Werte auch gültig sind und keine Exception
  90.   ; auslösen.
  91.   CALLEXEC UserState
  92.   move.l (sp)+,a1
  93.   CALLEXEC FreeVec
  94. NoMem:
  95.   rts
  96.  
  97. HandleExcept:
  98.   move.l $10(sp),a0      ; Fehleradresse
  99.   cmp.l #$C0001000,a0    ; die schreibgeschützte
  100.   beq WriteProtect       ; Seite ?
  101.   cmp.l #$C0002000,a0    ; die ungültige
  102.   beq Invalid            ; Seite ?
  103. OtherErr:
  104.   jmp (a4)               ; alter Exceptionhandler
  105. Invalid:
  106.   move.w 6(sp),d0
  107.   lsr.w #8,d0
  108.   lsr.w #4,d0
  109.   moveq #24,d1
  110.   cmp.w #$B,d0
  111.   bne ShortStack
  112.   add.w #60,d1
  113. ShortStack:
  114.   move.l (sp),0(sp,d1)
  115.   move.l 4(sp),4(sp,d1)
  116.   lea.l 0(sp,d1),sp
  117.   move.l #Ende,2(sp)  ; Rücksprungadresse ändern
  118.   and.w #$0FFF,6(sp)
  119.   rte
  120. WriteProtect:
  121.   bclr.b #0,$A(sp)
  122.   rte
  123.  
  124. Flash:
  125.   lea.l IntName,a1
  126.   moveq #0,d0
  127.   CALLEXEC OpenLibrary
  128.   tst.l d0
  129.   beq ExitFlash
  130.   move.l d0,a6
  131.   sub.l a0,a0
  132.   jsr _LVODisplayBeep(a6)
  133.   move.l a6,a1
  134.   CALLEXEC CloseLibrary
  135. ExitFlash:
  136.   rts
  137.  
  138. TCValue:
  139.   dc.l %10000000110000000100100010000000
  140. OldTCValue:
  141.   dc.l 0
  142. ClearTC:
  143.   dc.l 0
  144. MMUSRReg:
  145.   dc.w 0
  146. * E=1 / SRE+FCL=0 / PS=1100=4KByte / IS=0 / TIA=4 /
  147. * TIB=8 / TIC=8 /TID=0
  148. RootPointerDesc:
  149.   dc.l $80000003,LevelA
  150. OldRootPointerDesc:
  151.   dc.l $00000000,$00000000
  152. * L/U=1 / LIMIT=0 / DT=3=8 Byte-Tabelle / Adresse
  153. * der Tabelle
  154.  
  155. Page0:
  156.   dc.w $0123
  157.   ds.b 4094  ; Jede Seite hat 4 KByte
  158. Page1:
  159.   dc.w $3210
  160.   ds.b 4094
  161.  
  162. LevelA:
  163.   dc.l $8000FC01,$00000000 ; Early-Termination
  164.   dc.l $8000FC01,$10000000 ; es wird so übersetzt,
  165.   dc.l $8000FC01,$20000000 ; daß die physikalische
  166.   dc.l $8000FC01,$30000000 ; gleich der logischen
  167.   dc.l $8000FC01,$40000000 ; ist. Diese Tabelle ist
  168.   dc.l $8000FC01,$50000000 ; nicht eingeschränkt.
  169.   dc.l $8000FC01,$60000000
  170.   dc.l $8000FC01,$70000000
  171.   dc.l $8000FC01,$80000000
  172.   dc.l $8000FC01,$90000000
  173.   dc.l $8000FC01,$A0000000
  174.   dc.l $8000FC01,$B0000000
  175.   dc.l $0000FC03,LevelB ; Außer hier, wo unsere
  176.   ; nächste Tabelle folgt, die auf den Eintrag 0
  177.   ; begrenzt ist.
  178.   dc.l $8000FC01,$D0000000
  179.   dc.l $8000FC01,$E0000000
  180.   dc.l $8000FC01,$F0000000
  181.  
  182. LevelB:
  183.   dc.l $0002FC02,LevelC ; Zeiger auf 4 Byte-Tabelle,
  184.   ; die auf zwei Einträge (0 und 1) limitiert ist.
  185.  
  186.   dc.l 0,0  ; Pad auf 16 Byte-Grenze
  187. LevelC:
  188.   dc.l Page0+$01  ; Zeiger auf Seite
  189.   dc.l Page1+$05  ; Zeiger auf Seite und
  190.   ; Screibschutz
  191.   dc.l $00000000  ; ungültiger Descriptor
  192. PageMemLen EQU *-Page0
  193.  
  194. IntName:
  195.   dc.b 'intuition.library',0
  196.  
  197.         END
  198.